#include <bits/stdc++.h>
using namespace std;
//#define DEbug



struct Node
{
    double l;
    double r;
} nodes[100100],bf[100100];
int nonums=2;
int bfnums=0;
int n,m,l,v;
int d[100100],vv[100100],aa[100100];
int p[100100];

bool findinp(int l,int r)
{
    for(int i=0; i<n; i++)
    {
        if(p[i]>r)return false;
        if(l<=p[i]&&p[i]<=r)return true;
    }
    return false;
}

void addd(Node t)
{
    bf[bfnums]=t;
    bfnums++;
}

void adde(Node t)
{
    for(int i=0; i<nonums-1; i++)
    {
        if(nodes[i].r>=t.r&&nodes[i].l<=t.l)
        {
            //nodes[i].r=t.r;
            //nodes[i].l=t.l;

            return;
        }
        if(nodes[i].r<=t.r&&nodes[i].l>=t.l)
        {
            nodes[i].r=t.r;
            nodes[i].l=t.l;

            return;
        }
        if(nodes[i].r<t.l&&t.r<nodes[i+1].l)
        {
            nonums++;
            for(int j=nonums-1; j>=i; j--)
            {
                nodes[j+1].l=nodes[j].l;
                nodes[j+1].r=nodes[j].r;
            }
            nodes[i+1].l=t.l;
            nodes[i+1].r=t.r;
            return;
        }
        if(nodes[i].r<t.l)continue;
        int nll=max(nodes[i].l,t.l);
        int nrr=min(nodes[i].r,t.r);
        if(findinp(nll,nrr))
        {
            nodes[i].l=nll;
            nodes[i].r=nrr;
        }
        else
        {
            nonums++;
            for(int j=nonums-1; j>=i; j--)
            {
                nodes[j+1].l=nodes[j].l;
                nodes[j+1].r=nodes[j].r;
            }
            nodes[i+1].l=t.l;
            nodes[i+1].r=t.r;
            return;
        }
        return;
    }
}
void checkcheck()
{
    Node nodes2[100100];
    for(int i=0; i<100100; i++)
    {
        nodes2[i].l=nodes[i].l;
        nodes2[i].r=nodes[i].r;
        nodes[i].l=0;
        nodes[i].r=0;
    }
    int tnonums=nonums;
    nonums=2;
    nodes[0].l=0;
    nodes[0].r=0;
    nodes[1].l=1e300;
    nodes[1].r=1e300;
    for(int i=1; i<tnonums-1; i++)
    {
        adde(nodes2[i]);
    }
}

int main()
{
    nodes[0].l=0;
    nodes[0].r=0;
    nodes[1].l=1e300;
    nodes[1].r=1e300;
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    int T;
    cin>>T;
    int cccount = 0;
    while(T--)
    {
        cin>>n>>m>>l>>v;
        for(int i=0; i<n; i++)
            cin>>d[i]>>vv[i]>>aa[i];
        for(int i=0; i<m; i++)
            cin>>p[i];
        sort(p,p+m);
        for(int i=0; i<n; i++)
        {
            int netime=0;
            if(vv[i]<=v&&aa[i]<=0)
            {
                if(p[m-1]>=d[i])
                {
                    cccount ++;
                    Node nnt;
                    nnt.l=d[i];
                    nnt.r=l+1;
                    adde(nnt);
                    addd(nnt);
#ifdef DEbug
                    cout<<"l: "<<nnt.l<<" r:"<<nnt.r<<endl;

#endif // DEbug
                }

                continue;
            }

            if(vv[i]>v&&aa[i]>=0)
            {
                Node nnt;
                nnt.l=d[i];
                nnt.r=l+1;
                adde(nnt);
                addd(nnt);
#ifdef DEbug
                cout<<"l: "<<nnt.l<<" r:"<<nnt.r<<endl;

#endif // DEbug
            }
            if(vv[i]>v&&aa[i]<0)
            {
                double netime=(vv[i]-v)*(double)1.0/-aa[i];
                //cout<<netime<<"#1 "<<endl;
                double nes = vv[i]*netime+(double)0.5*aa[i]*netime*netime;
                Node nnt;
                nnt.l=d[i];
                nnt.r=d[i]+nes;

                for(int i=0; i<m; i++)
                {
                    if(p[i]>nnt.r)break;
                    if(p[i]<=nnt.r&&p[i]>=nnt.l)
                    {
#ifdef DEbug
                        cout<<"l: "<<nnt.l<<" r:"<<nnt.r<<endl;

#endif // DEbug

                        adde(nnt);
                        addd(nnt);
                        cccount ++;
                        break;
                    }
                }
            }
            if(vv[i]<=v&&aa[i]>0)
            {
                double netime=(v-vv[i])*(double)1.0/aa[i];
                //cout<<netime<<"#2 "<<endl;
                double nes = vv[i]*netime+(double)0.5*aa[i]*netime*netime;
                Node nnt;
                nnt.l=d[i]+nes;
                if(nnt.l>=l+0.001)continue;
                nnt.r=l+1;

                if(p[m-1]>=nnt.l)cccount ++;

                adde(nnt);
                addd(nnt);
#ifdef DEbug
                cout<<"l: "<<nnt.l<<" r:"<<nnt.r<<endl;

#endif // DEbug
            }

        }
        Node ttt11;
        ttt11.l=51251;
        ttt11.r=143336;
        // adde(ttt11);
        for(int i=0; i<10; i++)
            checkcheck();

#ifdef DEbug2
        for(int i=0; i<bfnums; i++)
        {
            adde(bf[i]);
        }
        //adde(ttt11);
        for(int i=0; i<10; i++)
            checkcheck();
#endif
        cout<<cccount<<" "<<m-(nonums-2);
        if(T!=0)cout<<endl;
#ifdef DEbug
        for(int i=0; i<nonums+5; i++)
            cout<<nodes[i].l<<' '<<nodes[i].r<<endl;
#endif
        for(int i=0; i<100100; i++)
        {
            nodes[i].l=0;
            nodes[i].r=0;
        }
        nonums=2;
        nodes[0].l=0;
        nodes[0].r=0;
        nodes[1].l=1e300;
        nodes[1].r=1e300;
        cccount=0;
    }
    return 0;
}
